﻿using System;
using System.Collections.Generic;
using System.Linq;
using EnterpriseLibraryWrapper;
using itau.im.dado;
using itau.im.entidade;
using Itau.IM.CAS;

namespace itau.im.negocio
{
    public class GrupoParametrosBS : IGrupoParametrosBS
    {
        #region Metodos

        public void CriarProdutoFinanceiroAlocacoes(int codigoGrupoParametros, IList<ProdutoFinanceiro> listaProdutosFinanceiros)
        {
            IGrupoParametrosDAO grupoParametrosDAO;
            ProdutoFinanceiroAlocacao objProdutoFinanceiroAlocacao;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                objProdutoFinanceiroAlocacao = new ProdutoFinanceiroAlocacao();

                DateTime dataRetroativa = new DateTime(2000, 01, 01);

                foreach (ProdutoFinanceiro objProdutoFinanceiro in listaProdutosFinanceiros)
                {
                    foreach (ProdutoFinanceiroDerivado objProdFinDer in objProdutoFinanceiro.ProdutoFinanceiroDerivado)
                    {
                        if (grupoParametrosDAO.ValidaProdutoFinanceiroAlocacaoExistente(objProdFinDer.CodigoProdutoFinanceiroDerivado))
                        {
                            objProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = codigoGrupoParametros;
                            objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiro = objProdFinDer.CodigoProdutoFinanceiro;
                            objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiroDerivado = objProdFinDer.CodigoProdutoFinanceiroDerivado;
                            objProdutoFinanceiroAlocacao.DataInicioVigenciaProduto = DateTime.Now;
                            objProdutoFinanceiroAlocacao.DataFimVigencia = DateTime.MinValue;
                        }
                        else
                        {
                            objProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = codigoGrupoParametros;
                            objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiro = objProdFinDer.CodigoProdutoFinanceiro;
                            objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiroDerivado = objProdFinDer.CodigoProdutoFinanceiroDerivado;
                            objProdutoFinanceiroAlocacao.DataInicioVigenciaProduto = dataRetroativa;
                            objProdutoFinanceiroAlocacao.DataFimVigencia = DateTime.MinValue;
                        }

                        grupoParametrosDAO.CriarProdutoFinanceiroAlocacao(objProdutoFinanceiroAlocacao);
                    }
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
                objProdutoFinanceiroAlocacao = null;
            }
        }

        public void CriarProdutoFinanceiroDerivadoAlocacoes(int codigoGrupoParametros,
            IList<ProdutoFinanceiroDerivado> listaProdutosFinanceirosDerivados)
        {
            IGrupoParametrosDAO grupoParametrosDAO;
            ProdutoFinanceiroAlocacao objProdutoFinanceiroAlocacao;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                
                DateTime dataRetroativa = new DateTime(2000, 01, 01);
                objProdutoFinanceiroAlocacao = new ProdutoFinanceiroAlocacao();

                foreach (ProdutoFinanceiroDerivado objProdFinDer in listaProdutosFinanceirosDerivados)
                {
                    if (grupoParametrosDAO.ValidaProdutoFinanceiroAlocacaoExistente(objProdFinDer.CodigoProdutoFinanceiroDerivado))
                    {
                        objProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = codigoGrupoParametros;
                        objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiro = objProdFinDer.CodigoProdutoFinanceiro;
                        objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiroDerivado = objProdFinDer.CodigoProdutoFinanceiroDerivado;
                        objProdutoFinanceiroAlocacao.DataInicioVigenciaProduto = DateTime.Now;
                        objProdutoFinanceiroAlocacao.DataFimVigencia = DateTime.MinValue;
                    }
                    else
                    {
                        objProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = codigoGrupoParametros;
                        objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiro = objProdFinDer.CodigoProdutoFinanceiro;
                        objProdutoFinanceiroAlocacao.CodigoProdutoFinanceiroDerivado = objProdFinDer.CodigoProdutoFinanceiroDerivado;
                        objProdutoFinanceiroAlocacao.DataInicioVigenciaProduto = dataRetroativa;
                        objProdutoFinanceiroAlocacao.DataFimVigencia = DateTime.MinValue;
                    }
                    
                    grupoParametrosDAO.CriarProdutoFinanceiroAlocacao(objProdutoFinanceiroAlocacao);
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
                objProdutoFinanceiroAlocacao = null;
            }
        }

        public bool ValidaProdutoFinanceiroAlocacaoExistente(int codProdutoFinanceiroDerivado)
        {
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                return grupoParametrosDAO.ValidaProdutoFinanceiroAlocacaoExistente(codProdutoFinanceiroDerivado);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }

            return false;
        }

        public IList<ParametroAtribuicao> ObterParametrosAtribuicaoPorGrupoVigente(int codigoGrupo)
        {
            IList<ParametroAtribuicao> listaParametrosAlocados = null;
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                listaParametrosAlocados = grupoParametrosDAO.ObterParametrosAtribuicaoPorGrupoVigente(codigoGrupo);

                using (IntegracaoCAS CAS = new IntegracaoCAS())
                {
                    return CAS.FiltrarRegistros<ParametroAtribuicao>(listaParametrosAlocados, DominioAcesso.Parametro, Itau.IM.CAS.TipoAcesso.Consulta);
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaParametrosAlocados = null;
                grupoParametrosDAO = null;
            }

            return new List<ParametroAtribuicao>();
        }

        public void RemoverGrupoParametroAtribuicao(int codigoGrupo)
        {
            IGrupoParametrosDAO GrupoParametrosDAO;

            try
            {
                using (IntegracaoCAS CAS = new IntegracaoCAS())
                {
                    if (!CAS.UsuarioAdministrador)
                    {
                        System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Unauthorized;
                    }
                }

                GrupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                GrupoParametrosDAO.RemoverProdutoFinanceiroAlocacoes(codigoGrupo);

                GrupoParametrosDAO.RemoverParametroAtribuicaoGrupoAlocacoes(codigoGrupo);

                GrupoParametrosDAO.RemoverGrupoParametroAtribuicao(codigoGrupo);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (CASException ce)
            {
                throw new Exception(ce.Message);
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                GrupoParametrosDAO = null;
            }
        }

        public void RemoverProdutoFinanceiroAlocacoes(int codigoGrupo, DateTime dataHoraFim)
        {
            IGrupoParametrosDAO grupoParametrosDAO;


            try
            {
                ProdutoFinanceiroAlocacao ProdutoFinanceiroAlocacao = new ProdutoFinanceiroAlocacao();
                ProdutoFinanceiroAlocacao.CodigoGrupoParametroAtribuicao = codigoGrupo;
                ProdutoFinanceiroAlocacao.DataFimVigencia = dataHoraFim;
                
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                grupoParametrosDAO.AtualizarProdutoFinanceiroAlocacao(ProdutoFinanceiroAlocacao);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }
        }

        public void RemoverProdutoFinanceiroAlocacoesPorCodigoProdutoDerivado(IList<ProdutoFinanceiroAlocacao> listaProdutosFinanceiros, DateTime dataHoraFim)
        {
            IGrupoParametrosDAO grupoParametrosDAO;
            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                foreach (ProdutoFinanceiroAlocacao item in listaProdutosFinanceiros)
                {
                    grupoParametrosDAO.AtualizarProdutoFinanceiroAlocacaoPorCodigoProdutoAlocacao(item);
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }
        }

        public void RemoverParametroAtribuicaoGrupoAlocacao(IList<ParametroAtribuicaoGrupoAlocacao> listaParametroAtribuicaoGrupoAlocacao)
        {
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                foreach (ParametroAtribuicaoGrupoAlocacao parametroAtribuicaoGrupoAlocacao in listaParametroAtribuicaoGrupoAlocacao)
                {
                    parametroAtribuicaoGrupoAlocacao.DataFimVigencia = System.DateTime.Today.AddDays(-1);
                    grupoParametrosDAO.AtualizarParametroAtribuicaoGrupoAlocacao(parametroAtribuicaoGrupoAlocacao);
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }
        }

        public int CriarGrupoParametros(GrupoParametroAtribuicao grupoParametros)
        {
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                using (IntegracaoCAS CAS = new IntegracaoCAS())
                {
                    if (!CAS.UsuarioAdministrador)
                    {
                        System.ServiceModel.Web.WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Unauthorized;
                    }
                }

                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                return grupoParametrosDAO.CriarGrupoParametros(grupoParametros);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (CASException ce)
            {
                throw new Exception(ce.Message);
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }
            return 0;
        }

        public IList<ParametroAtribuicaoGrupoAlocacao> ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(int codigoGrupo)
        {
            IList<ParametroAtribuicaoGrupoAlocacao> lstParametroAtribuicaoGrupoAlocacao = null;

            try
            {
                IGrupoParametrosDAO GrupoParametroDAO = DaoFactory.getGrupoParametrosDAO();

                lstParametroAtribuicaoGrupoAlocacao = GrupoParametroDAO.ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(codigoGrupo);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }

            return lstParametroAtribuicaoGrupoAlocacao;
        }

        public IList<ProdutoFinanceiro> ObterProdutosFinanceirosNaoAlocados()
        {
            IList<ProdutoFinanceiro> listaProdutosNaoAlocados = null;
            IGrupoParametrosDAO grupoParametroDAO = null;

            try
            {
                grupoParametroDAO = DaoFactory.getGrupoParametrosDAO();

                listaProdutosNaoAlocados = grupoParametroDAO.ObterProdutosFinanceirosNaoAlocados();

                return listaProdutosNaoAlocados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaProdutosNaoAlocados = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosFinanceirosDerivadosNaoAlocados()
        {
            IList<ProdutoFinanceiroDerivado> listaProdutosNaoAlocados = null;
            IGrupoParametrosDAO grupoParametroDAO = null;

            try
            {
                grupoParametroDAO = DaoFactory.getGrupoParametrosDAO();

                listaProdutosNaoAlocados = grupoParametroDAO.ObterProdutosFinanceirosDerivadosNaoAlocados();

                return listaProdutosNaoAlocados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaProdutosNaoAlocados = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<ProdutoFinanceiro> ObterProdutosFinanceirosPorGrupoParametrosVigente(int codigoGrupo)
        {
            IList<ProdutoFinanceiro> lstProdutoFinanceiro = null;
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                lstProdutoFinanceiro = grupoParametrosDAO.ObterProdutosFinanceirosPorGrupoParametrosVigente(codigoGrupo);

                return lstProdutoFinanceiro;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                lstProdutoFinanceiro = null;
                grupoParametrosDAO = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public IList<ProdutoFinanceiroAlocacao> ObterProdutoFinanceiroAlocacaoPorGrupoParametro(int codigoGrupoParametro)
        {
            IList<ProdutoFinanceiroAlocacao> lstProdutoFinanceiroAlocacao = null;
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                lstProdutoFinanceiroAlocacao = grupoParametrosDAO.ObterProdutoFinanceiroAlocacaoPorGrupoParametro(codigoGrupoParametro);

                return lstProdutoFinanceiroAlocacao;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                lstProdutoFinanceiroAlocacao = null;
                grupoParametrosDAO = null;
            }

            return new List<ProdutoFinanceiroAlocacao>();
        }

        public IList<ProdutoFinanceiro> ObterProdutosExcecaoPorGrupoParametrosVigente(int codigoGrupo)
        {
            IList<ProdutoFinanceiro> listaprodutofinanceiro = null;

            try
            {
                IGrupoParametrosDAO grupoparametroDAO = DaoFactory.getGrupoParametrosDAO();

                listaprodutofinanceiro = grupoparametroDAO.ObterProdutosExcecaoPorGrupoParametrosVigente(codigoGrupo);

                return listaprodutofinanceiro;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaprodutofinanceiro = null;
            }

            return new List<ProdutoFinanceiro>();
        }

        public IList<ProdutoFinanceiroDerivado> ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(int codigoGrupo)
        {
            IList<ProdutoFinanceiroDerivado> listaprodutofinanceiroDerivados = null;

            try
            {
                IGrupoParametrosDAO grupoparametroDAO = DaoFactory.getGrupoParametrosDAO();

                listaprodutofinanceiroDerivados = grupoparametroDAO.ObterProdutosFinanceirosDerivadosExcecaoPorGrupoParametrosVigente(codigoGrupo);

                return listaprodutofinanceiroDerivados;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaprodutofinanceiroDerivados = null;
            }

            return new List<ProdutoFinanceiroDerivado>();
        }

        public IList<DominioParametroAtribuicao> ObterDominiosParametrosAtribuicaoPorGrupoVigente(int codigoGrupo)
        {
            IList<DominioParametroAtribuicao> lista = null;
            IGrupoParametrosDAO grupoParametroDAO;

            try
            {
                grupoParametroDAO = DaoFactory.getGrupoParametrosDAO();

                lista = grupoParametroDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(codigoGrupo);

                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                lista = null;
                grupoParametroDAO = null;
            }

            return new List<DominioParametroAtribuicao>();
        }

        public IList<ParametroAtribuicao> ObterParametrosNaoAlocadosPorGrupoParametroVigente(int codigoGrupo)
        {
            IList<ParametroAtribuicao> listaParametrosExogenos = null;
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                listaParametrosExogenos = grupoParametrosDAO.ObterParametrosNaoAlocadosPorGrupoParametroVigente(codigoGrupo);

                using (IntegracaoCAS CAS = new IntegracaoCAS())
                {
                    return CAS.FiltrarRegistros<ParametroAtribuicao>(listaParametrosExogenos, DominioAcesso.Parametro, Itau.IM.CAS.TipoAcesso.Consulta);
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaParametrosExogenos = null;
                grupoParametrosDAO = null;
            }

            return new List<ParametroAtribuicao>();
        }

        public void CriarParametroAtribuicaoGrupoAlocacoes(IList<ParametroAtribuicaoGrupoAlocacao> listaParametrosEndogenosAlocacao)
        {
            IGrupoParametrosDAO grupoParametrosDAO = null;
 
            ParametroAtribuicaoGrupoAlocacao[] listParametroAtribuicaoGrupoAlocacao = null;

            try
            {
                listParametroAtribuicaoGrupoAlocacao = listaParametrosEndogenosAlocacao.ToArray();

                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                if (listParametroAtribuicaoGrupoAlocacao != null && listParametroAtribuicaoGrupoAlocacao.Length > 0)
                {
                    foreach (ParametroAtribuicaoGrupoAlocacao parametroAtribuicaoGrupoAlocacao in listParametroAtribuicaoGrupoAlocacao)
                    {
                        parametroAtribuicaoGrupoAlocacao.DataFimVigencia = DateTime.MinValue;

                        grupoParametrosDAO.CriarParametroAtribuicaoGrupoAlocacao(parametroAtribuicaoGrupoAlocacao);
                    }
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }
        }

        public int ObterNumeroParametroAtribuicaoGrupoAlocacaoPorCodigoParametro(int codigoParametro)
        {
            int numeroEndogenos;
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                numeroEndogenos = grupoParametrosDAO.ObterNumeroParametrosAtribuicaoGrupoAlocacaoPorCodigoParametro(codigoParametro);

                return numeroEndogenos;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }

            return 0;
        }

        public IList<RegraAtribuicaoCurva> ObterRegras(int codigoGrupo, DateTime dataInclusaoVigencia)
        {
            IList<RegraAtribuicaoCurva> listaRegras = null;
            IGrupoParametrosDAO grupoParametrosDAO;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                listaRegras = grupoParametrosDAO.ObterRegras(codigoGrupo, dataInclusaoVigencia);
                return listaRegras;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                listaRegras = null;
                grupoParametrosDAO = null;
            }

            return new List<RegraAtribuicaoCurva>();
        }

        public IList<DominioParametroAtribuicao> ObterDominiosParametroAtribuicaoPorGrupoVigente(int codigoGrupo)
        {

            IGrupoParametrosDAO grupoParametrosDAO = null;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                return grupoParametrosDAO.ObterDominiosParametrosAtribuicaoPorGrupoVigente(codigoGrupo);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }

            return null;
        }

        public IList<GrupoParametroAtribuicao> ObterGruposDeParametros()
        {
            IGrupoParametrosDAO grupoParametrosDAO = null;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();

                using (IntegracaoCAS CAS = new IntegracaoCAS())
                {
                    return CAS.FiltrarRegistros<GrupoParametroAtribuicao>(grupoParametrosDAO.ObterGruposDeParametros(), DominioAcesso.GrupoParametro, Itau.IM.CAS.TipoAcesso.Consulta);
                }
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }

            return null;
        }

        public int ObterCodigoGrupoParametroAtribuicao(ProdutoFinanceiroDerivado produtoFinanceiroDerivado, DateTime dataInicioVigencia)
        {
            IGrupoParametrosDAO grupoParametrosDAO = null;

            try
            {
                grupoParametrosDAO = DaoFactory.getGrupoParametrosDAO();
                return grupoParametrosDAO.ObterCodigoGrupoParametroAtribuicao(produtoFinanceiroDerivado, dataInicioVigencia);
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (NegociosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosNegocios");
            }
            finally
            {
                grupoParametrosDAO = null;
            }

            return 0;
        }

        #endregion
    }
}